package 力扣.双指针.双指针;

public class 尽可能使字符串相等1208 {
    public static void main(String[] args) {

//        String ints1 = "abcd";
//        String ints2 = "bcdf";
//        String ints1 = "ujteygggjwxnfl";
//        String ints2 = "nstsenrzttikoy";
        String ints1 = "krrgw";
        String ints2 = "zjxss";
//        String ints1 = "k";
//        String ints2 = "z";
        int i = equalSubstring(ints1, ints2, 19);
        System.out.println(i);
    }

    /**
     * 保证开销大于零的情况下，移动窗口（窗口大小不固定，因为开销不同） 寻找最大长度
     */
    public static int equalSubstring(String s, String t, int maxCost) {
        int re = 0;//当前结果
        int maxAns = 0;//结果（最大个数）
        int[] reNums = new int[s.length()];//保存第i个元素时，两个字符的差值
        int left = 0;//左指针
        for (int i = 0; i < s.length(); i++) {
            char c1 = s.charAt(i);
            char c2 = t.charAt(i);
            int de = Math.abs(c2 - c1);//ASC||数值差
            reNums[i] = de;//保存差值
            maxCost -= de;
            if (maxCost < 0 ){//直到开销 小于 0 :说明已经不能继续了，当前字符也不能变换，不要忘记了
                  maxAns = Math.max(maxAns, re);//获取最大结果
                  while (maxCost < 0){//移动左指针，直到开销不小于0，之后我们才能移动右指针
                      maxCost += reNums[left];
                      left++;
                      re--;
                  }
                  re++;//此时当前字符可以变换了，re++
            }else {
                re++;//长度++
            }
        }
        return Math.max(maxAns, re);//到达数组末尾 re可能大于maxAns ，还要计算一次最大值
    }
}
